package bean.dao;

import java.util.*;

import hbt.HibernateUtil;
import org.hibernate.*;

import bean.*;


public class OrdenDeCompraDAO {
	private static OrdenDeCompraDAO instancia = null;
	private static SessionFactory sf = null;

	public static OrdenDeCompraDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new OrdenDeCompraDAO();
		} 
		return instancia;
	}
		
	@SuppressWarnings("unchecked")
	public ArrayList <String> generarOrdenesDeCompra(){
		ArrayList <String> vectorOrdenesXML = new ArrayList <String>();
		ArrayList <OrdenDeCompra> ordenes = new ArrayList<OrdenDeCompra>();
		Session session = sf.openSession();
		session.beginTransaction();		
		/*Busco proveedores con ordenes de pedido pendientes de compra*/
		List <Object> proveedores = session.createQuery("select p.cuil from Item_OrdenDePedido iop, Item_Cotizacion ic, ListaDePrecios lp, Proveedor p, Producto pr where (iop.pendienteDeCompra = 1) and (ic.cotizacion.numCot = iop.cotizacion.numCot) and (iop.producto.idProducto.nroSerie = ic.producto.idProducto.nroSerie)and (iop.producto.idProducto.sufijo = ic.producto.idProducto.sufijo) and (lp.idLista.numero = ic.listaDePrecio.idLista.numero)and (p.cuil = lp.proveedor.cuil)and (pr.idProducto.nroSerie = iop.producto.idProducto.nroSerie)and (pr.idProducto.sufijo = iop.producto.idProducto.sufijo) group by p.cuil").list();
		/*Recorro la lista de proveedores, genero la orden de compra y busco sus items*/
		for (int i =0; i<proveedores.size();i++){
			OrdenDeCompra OC = new OrdenDeCompra();
			OC.setFecha(FechaDAO.getInstancia().getFechaActual());	
			Proveedor proveedor = ProveedorDAO.getInstancia().buscarProveedor(proveedores.get(i).toString());
			OC.setProveedor(proveedor);
			session.persist(OC);
			/*busco los items de ese proveedor pendientes de compra*/
			Query query = session.createQuery("select pr.idProducto.nroSerie,pr.idProducto.sufijo, sum (iop.cantidadSolicitada) from Item_OrdenDePedido iop, Item_Cotizacion ic, ListaDePrecios lp, Proveedor p, Producto pr where (iop.pendienteDeCompra = 1) and (ic.cotizacion.numCot = iop.cotizacion.numCot) and (iop.producto.idProducto.nroSerie = ic.producto.idProducto.nroSerie)and (iop.producto.idProducto.sufijo = ic.producto.idProducto.sufijo) and (lp.idLista.numero = ic.listaDePrecio.idLista.numero)and (p.cuil = lp.proveedor.cuil)and (pr.idProducto.nroSerie = iop.producto.idProducto.nroSerie)and (pr.idProducto.sufijo = iop.producto.idProducto.sufijo)and (p.cuil=:cuil) group by p.cuil,pr.idProducto.nroSerie,pr.idProducto.sufijo,iop.cantidadSolicitada");
			query.setParameter("cuil", proveedor.getCuil());
			List <Object[]> itemsAComprar = query.list();
			for (int j=0; j<itemsAComprar.size();j++){
				Item_OrdenDeCompra item = new Item_OrdenDeCompra();
				item.setOrdenDeCompra(OC);
				item.setProducto(ProductoDAO.getInstancia().buscarProducto(String.valueOf(itemsAComprar.get(j)[0]),String.valueOf(itemsAComprar.get(j)[1])));
				item.setCantidad((Long) itemsAComprar.get(j)[2]);
				OC.getItems().add(item);
				session.persist(item);
				
			}
			ordenes.add(OC);
		}
		
		session.flush();
		session.getTransaction().commit();
		sf.close();
		
		for (int i =0; i< ordenes.size();i++){
			String xmlOrden = XmlDAO.getInstancia().generarOrdenDeCompra(ordenes.get(i));
			vectorOrdenesXML.add(xmlOrden);
		}
		return vectorOrdenesXML;
	}
	
	
	public OrdenDeCompra buscarOrdenDeCompra(int idOC){
		OrdenDeCompra oc = new OrdenDeCompra();
		Session session = sf.openSession();
		Query query = session.createQuery("from OrdenDeCompra oc where (oc.idOC=:numero)");
		query.setParameter("numero", idOC);
		oc = (OrdenDeCompra) query.uniqueResult();
		session.close();
		return oc;
	}
	
}
